package cn.echase.ecare.yinfayun.domain.dto;

import cn.echase.ecare.yinfayun.enums.EldIdTypeEnum;
import cn.echase.ecare.yinfayun.utils.JSONNodeUtil;
import cn.echase.ecare.yinfayun.utils.TransUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.dromara.common.satoken.utils.LoginHelper;

import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;

import static cn.echase.ecare.yinfayun.constants.AssessConstant.ElderBase.*;


/**
 * 评估信息表(AssessInfo)表实体类DTO
 */
@Data
public class AssessInfoDto implements Serializable {
    /**
     * 分页参数
     */
    private Integer pageNum;

    private Integer pageSize;
    /**
     * 长者id 兼容 cn.echase.nursinghome.dto.eld.checkin.OrgElderDto
     */
    private String elderId;
    /**
     * 评估编号
     */
    private String assessNo;
    //机构id
    private String orgId;

    /**
     * 部门id
     */
    private Long deptId;

    //长者id
    private String eldId;
    private String tenantId;
    /**
     * 评估的长者的类型 0 在院长者 1居家 2 入住登记 3 预约长者 4 其他长者
     */
    private Integer type;
    //长者姓名
    private String eldName;
    private Integer age;
    //性别 0未填写 1 男 2 女
    private Integer eldSex;
    /**
     * 长者证件类型 0 居民身份证 1 港澳居民来往内地通行证 2 台湾居民来往大陆通行证 3 其他法定有效证件
     */
    private String eldIdType;
    //长者身份证号
    private String eldIdNumber;
    /**
     * 长者床位
     */
    private String bedId;
    /**
     * 长者床位名称(主楼-1楼-101-01)
     */
    private String bedName;
    /**
     * 积木报表的id
     */
    private String reportId;
    //评估模板id
    private String templateId;
    //评估模板名称
    private String templateName;
    //评估模板分类id
    private String templateCategoryId;
    //评估模板分类名称
    private String templateCategoryName;
    //评估人员1ID
    private String assessorOne;
    //评估人员1姓名
    private String assessorOneName;
    //评估人员2ID
    private String assessorTwo;
    //评估人员2姓名
    private String assessorTwoName;
    //评估地点
    private String assessAddress;
    //长者能力最终等级
    private String ultimateAbilityLevel;
    //评估状态：1: 未完成 2：已完成
    private Integer assessStatus;
    //评估结果
    private String assessResult;
    //评估日期
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate assessDate;
    /**
     * 评估类型 1：首次评估  2：常规评估  3.即时评估  4：复评 5:其他
     */
    private Integer assessType;
    /**
     * 评估类型 中文
     */
    private String assessTypeName;
    /**
     * 评估结果json
     */
    private JSONObject resultJson;
    /**
     * 评估周期：0 12个月以内、1 超过12个月
     */
    private Integer assessCycle;
    /**
     * 开始日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startDate;
    /**
     * 结束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endDate;
    /**
     * 是否更新用户信息标识（1 [新输入的姓名]覆盖[历史的姓名]  2 [历史的姓名]覆盖[新输入的姓名]）
     */
    private String updateUserFlag;

    /**
     * 评估的长者的类型 0 在院长者 1居家 2 入住登记 3 预约长者 4 其他长者
     */
    private Integer eldType;

    private String assessId;

    private String assessPeriod;

    private List<String> assessIdList;

    /**
     * 初始化长者姓名、证件号(从ResultJson从解析长者姓名、证件号)
     * */
    public void initPropertiesFromResultJson(){
        JSONObject resultJson = this.getResultJson();
        String eldName = JSONNodeUtil.getValueFromJson(resultJson, ELD_NAME);
        if (StrUtil.isNotBlank(eldName)){
            this.setEldName(eldName);
        }
        String eldIdType = JSONNodeUtil.getValueFromJson(resultJson, ELD_ID_TYPE);
        if (StrUtil.isNotBlank(eldIdType)){
            this.setEldIdType(eldIdType);
        }
        String eldIdNumber = JSONNodeUtil.getValueFromJson(resultJson, ELD_ID_NUMBER);
        if (StrUtil.isNotBlank(eldIdNumber)){
            this.setEldIdNumber(eldIdNumber);
        }
    }

    /**
     * 初始化参数
     * */
    public void initProperties(){
        if (StrUtil.isBlank(this.getOrgId())) {
            this.setOrgId(LoginHelper.getOrgId());
        }
        if (StrUtil.isBlank(this.getTenantId())) {
            this.setTenantId(LoginHelper.getOrgId());
        }
        if (StrUtil.isBlank(this.getElderId()) && StrUtil.isNotBlank(this.getEldId())){
            this.setElderId(this.getEldId());
        }

        String eldIdType = StrUtil.isNotBlank(this.getEldIdType()) ? this.getEldIdType() : EldIdTypeEnum.TYPE_0.getTypeValue();
        String eldIdNumber = this.getEldIdNumber();

        if (StrUtil.isNotBlank(this.getEldIdNumber()) && ObjUtil.isEmpty(this.getAge())){
            Integer age = TransUtil.getAgeFromId(eldIdType, eldIdNumber);
            if (ObjUtil.isNotNull(age)){
                this.setAge(age);
            }
        }

        Integer eldSex = TransUtil.getSexFromId(eldIdType, eldIdNumber);
        if (ObjUtil.isNotNull(eldSex)){
            this.setEldSex(eldSex);
        }
    }

    public static void main(String[] args) {
        JSONObject resultJson = new JSONObject();
        resultJson.put("eldName", "张三0");
        resultJson.put("eldIdNumber", "100");

        AssessInfoDto assessInfoDto = new AssessInfoDto();
        assessInfoDto.setEldName("张三01");
        assessInfoDto.setEldIdNumber("101");
        assessInfoDto.setResultJson(resultJson);

        System.out.println(JSONUtil.toJsonStr(assessInfoDto));
        assessInfoDto.initPropertiesFromResultJson();
        System.out.println(JSONUtil.toJsonStr(assessInfoDto));
    }

}
